package cn.how2j.basics.middle.Lambda;

import cn.how2j.basics.charactor.Hero;

import java.util.*;

/**
 * Created by SilentJhin on 2020/8/18 18:51
 */
public class LambdaTest {
    public static void main(String[] args) {
        Random r = new Random();
        List<Hero> heros = new ArrayList<Hero>();
        for (int i = 0; i < 5; i++) {
            heros.add(new Hero("hero " + i, r.nextInt(1000), r.nextInt(100)));
        }
        System.out.println("初始化后的集合：");
        System.out.println(heros);
        System.out.println("使用匿名类的方式，筛选出 hp>100 && damange<50的英雄");

        // 匿名类演变lambda表达式
        // 1
        HeroChecker c1 = new HeroChecker() {
            @Override
            public boolean test(Hero h) {
                return (h.hp>100 && h.damage<50);
            }
        };
        // 2 保留方法参数和方法体
        HeroChecker c2 = (Hero h) -> {
            return (h.hp>100 && h.damage<50);
        };
        // 3 return和{}去掉
        HeroChecker c3 = (Hero h) -> (h.hp>100 && h.damage<50);
        // 4 去掉参数类型,圆括号
        HeroChecker c4 = (h) -> (h.hp>100 && h.damage<50);
        // 只有一个参数的时候可以去掉圆括号
        HeroChecker c5 = h -> (h.hp>100 && h.damage<50);

        //filter(heros,checker);
        // lambda表达式 (参数 -> return后的语句)
        // lambda就是匿名方法,是一种把方法作为参数进行传递的编程思想
        // lambda缺点: 1 可读性差; 2 不便调试; 3 JDK1.8版本后才支持
        filter(heros, hero -> hero.hp>100 && hero.damage<50);

        Hero h1 = new Hero("h1", 100, 60);
        Hero h2 = new Hero("h2", 120, 55);

        // 根据集合里自定义对象的属性值进行排序
        Comparator<Hero> c = new Comparator<Hero>() {
            @Override
            public int compare(Hero o1, Hero o2) {
                if (o1.hp >= o2.hp){
                    return 1;
                }
                return -1;
            }
        };
        Collections.sort(heros, c);
        // lambda 表达式写法
        Collections.sort(heros, (hero1, hero2) -> (hero1.hp>=hero2.hp?1:-1));
    }

    private static void filter(List<Hero> heros, HeroChecker checker) {
        for (Hero hero : heros) {
            if(checker.test(hero)){
                System.out.print(hero);
            }
        }
    }

}
